<!--
 * @Author: luohongbiao
 * @Date: 2022-02-22 10:37:55
 * @LastEditTime: 2022-02-23 10:09:07
 * @LastEditors: luohongbiao1
 * @Description: 
 * @FilePath: \face_problem\2021-02-07\1.原型链和继承.html
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>原型链和继承</title>
</head>

<body>
    <script>
        function Person() {
            console.log("Person")
        }
        var dick = new Person()

        console.log(Person.prototype) //构造函数有prototype属性，指向Person的原型对象
        console.log(Person.prototype.constructor == Person) //原型对象的constructor属性指向构造函数
        console.log(dick.__proto__ == Person.prototype) // true 实例对象内部的__proto__指向构造函数的原型对象

        // 总结就是 ： 构造函数的原型属性 指向 构造函数的原型对象。原型对象的constructor属性，指向构造函数

        var obj = new Object()
        obj.name = "luohongbiao"
        console.log(obj.name) //undefined
        console.log(obj.prototype)
        console.log(obj.__proto__)
        console.log(Object.prototype)

        // 原型链：严格来说，js里的构造函数都有一个prototype属性，该属性指向构造函数的原型对象。当用new操作符创建对象时，
        // 对象都有一个__proto__属性，指向构造函数的原型对象。当使用实例对象的属性时，先从自有属性查找，找不到就从__proto__
        // 指向的原型对象中找。这就是原型链。

        // __proto__和constructor是对象所独有的，prototype是函数所独有的
    </script>
</body>

</html>